package util

import (
	"crypto/md5"
	"encoding/hex"

	"golang.org/x/crypto/bcrypt"
)

// HashPassword 密码哈希（bcrypt自动加盐）
func HashPassword(password string) (string, error) {
	hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	return string(hash), err
}

// CheckPassword 验证密码（哈希对比）
func CheckPassword(password, hash string) bool {
	return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) == nil
}

// GenerateMD5 生成“密码+盐值”的MD5哈希（32位十六进制字符串）
func GenerateMD5(password string) string {
	// 1. 组合“密码+盐值”（盐值位置可灵活调整，如 salt+password+salt，增强随机性）
	saltedPassword := password

	// 2. 计算MD5哈希（返回16字节二进制数据）
	md5Hash := md5.Sum([]byte(saltedPassword))

	// 3. 转换为32位十六进制字符串（小写，若需大写可改用hex.EncodeToString后再ToUpper）
	return hex.EncodeToString(md5Hash[:])
}

// VerifyMD5 验证密码：输入密码生成MD5后，与数据库存储的哈希比对
func VerifyMD5(inputPassword, storedHash string) bool {
	// 生成输入密码的MD5哈希，与存储的哈希对比
	inputHash := GenerateMD5(inputPassword)
	return inputHash == storedHash
}
